{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Jupyter Notebook Tutorial\n",
    "\n",
    "Jupyter Notebook gives you a convenient way to experiment with Python code, interspersing your experiments with notes and documentation. You can do all of this without having to muck about on the command line, and the resulting file can be easily published and shared with other people. In this course, I'll be using Jupyter Notebook to do in-class examples, and the notes will be made available as Jupyter Notebooks. Some of the homeworks will be assigned in the form of Jupyter Notebooks as well.\n",
    "\n",
    "An Jupyter Notebook consists of a number of \"cells,\" stacked on the page from top to bottom. Cells can have text or code in them. You can change a cell's type using the \"Cell\" menu at the top of the page; go to `Cell > Cell Type` and select either `Code` for Python code or `Markdown` for text. (You can also change this for the current cell using the drop-down menu in the toolbar.)\n",
    "\n",
    "## Text cells\n",
    "\n",
    "Make a new cell, change its type to `Markdown`, type some stuff and press `Ctrl-Enter`. Jupyter Notebook will \"render\" the text and display it on the page in rendered format. You can hit `Enter` or click in the cell to edit its contents again. Text in `Markdown` cells is rendered according to a set of conventions called Markdown. Markdown is a simple language for marking up text with basic text formatting information (such as bold, italics, hyperlinks, tables, etc.). [Here's a tutorial](http://markdowntutorial.com/). You'll also be learning Markdown in more detail in the Foundations course.\n",
    "\n",
    "## Code cells\n",
    "\n",
    "You can also press `Alt-Enter` to render the current cell and create a new cell. New cells will by default be `Code` cells. Try it now!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "This is a code cell.\n",
      "\n",
      "Any Python code you type in this cell will be run when you press the 'Run' button,\n",
      "or when you press Ctrl-Enter.\n",
      "\n",
      "If the code evaluates to something, or if it produces output, that output will be\n",
      "shown beneath the cell after you run it.\n"
     ]
    }
   ],
   "source": [
    "print(\"This is a code cell.\")\n",
    "print(\"\")\n",
    "print(\"Any Python code you type in this cell will be run when you press the 'Run' button,\")\n",
    "print(\"or when you press Ctrl-Enter.\")\n",
    "print(\"\")\n",
    "print(\"If the code evaluates to something, or if it produces output, that output will be\")\n",
    "print(\"shown beneath the cell after you run it.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "If your Python code generates an error, the error will be displayed in addition\n",
      "to any output already produced.\n"
     ]
    },
    {
     "ename": "ZeroDivisionError",
     "evalue": "division by zero",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mZeroDivisionError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-3-b1c1f52e3cdc>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"to any output already produced.\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0;36m1\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mZeroDivisionError\u001b[0m: division by zero"
     ]
    }
   ],
   "source": [
    "print(\"If your Python code generates an error, the error will be displayed in addition\")\n",
    "print(\"to any output already produced.\")\n",
    "\n",
    "1 / 0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Any variables you define or modules you import in one code cell will be available in subsequent code cells. Start with this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import random\n",
    "stuff = [\"cheddar\", \"daguerrotype\", \"elephant\", \"flea market\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "... and in subsequent cells you can do this:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "daguerrotype\n"
     ]
    }
   ],
   "source": [
    "print(random.choice(stuff))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Keyboard shortcuts\n",
    "\n",
    "As mentioned above, `Ctrl-Enter` runs the current cell; `Alt-Enter` runs the current cell and then creates a new cell. `Enter` will start editing whichever cell is currently selected. To quit editing a cell, hit `Esc`. If the cursor isn't currently active in any cell (i.e., after you've hit `Esc`), a number of other keyboard shortcuts are available to you:\n",
    "\n",
    "* `m` converts the selected cell to a Markdown cell\n",
    "* `b` inserts a new cell below the selected one\n",
    "* `x` \"cuts\" the selected cell; `v` pastes a previously cut cell below the selected cell\n",
    "* `h` brings up a help screen with many more shortcuts.\n",
    "\n",
    "## Saving your work\n",
    "\n",
    "Hit `Cmd-S` at any time to save your notebook. Jupyter Notebook also automatically saves occasionally. Make sure to give your notebook a descriptive title by clicking on \"Untitled0\" at the top of the page and replacing the text accordingly. Notebooks you save will be available on your server whenever you log in again, from wherever you log into the server.\n",
    "\n",
    "You can \"download\" your notebook in various formats via `File > Download as`. You can download your notebook as a static HTML file (for, e.g., uploading to a web site), or as a `.ipynb` file, which you can share with other people who have Jupyter Notebook or make available online through, e.g., [nbviewer](http://nbviewer.ipython.org/).\n",
    "\n",
    "## Where next?\n",
    "\n",
    "We'll discuss Jupyter Notebook features in more detail as the course progresses. In the meantime, consider consulting the [official documentation and tutorials](http://nbviewer.ipython.org/)."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
